線形回帰(Linear Regression)
Overview
線形回帰、もしくは通常最小二乗法(Ordinary Least Squares, OLS)は、最も単純で、最も古典的な線形回帰手法です。線形回帰には調整するパラメータがないので単純で扱いやすいですが、モデルの複雑さを制御する方法がないです。
線形回帰による予測
https://gyazo.com/e50d71fb946f23f9293ec04ca3de3639
Theory
線形回帰の予測式は、特徴量が1つの場合、複数の場合とで以下のようになります。また、このような関数は仮説関数と呼ばれます。
線形回帰の予測式(特徴量数:1)
$ h_\theta(x) = \theta_0 + \theta_1x_1
線形回帰の予測式(特徴量数:n)
$ h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ... + \theta_nx_n
$ = [$ \theta_0 $ \theta_1 ... $ \theta_n]$ \begin{pmatrix} x_0 \\ x_1 \\.\\.\\.\\ x_n \end{pmatrix} = \theta^Tx
この予測式$ h_\theta(x) と真の予測式$ y との平均二乗誤差(mean squared error)が最小になるように、パラメータ$ \theta_0 と$ \theta_{1...n} を求めます。平均二乗誤差は、予測と真の値との差を二乗したものの平均値です。式を2で割っているのは、後に微分する際に計算しやすくするためです。また、このときの関数を目的関数と呼び、このような問題を最適化問題と呼びます。
平均二乗誤差の式
$ J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2
この平均二乗誤差を最小にするのは、この関数の微分が0を取るときです。その過程を下のような更新式で表すことができ、この更新式を勾配降下法(バッチ勾配降下法)または最急降下法と呼びます。勾配降下法は、パラメータの値が収束するまでこの更新を続けます。
repeat until convergence: {
$ \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta) = \theta_j - \alpha \frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} $ for \ j:= 0...n
}
$ \theta_0, \theta_1... は、仮説関数の中にあるので、合成関数の微分を用いる必要があります。また、パラメータが複数あるので、偏微分します。
Coding(Regression)
waveデータセットでモデルを構築・学習・評価する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
# coef_属性: 係数(傾き)
print('lr.coef_: {}'.format(lr.coef_))
# intercept_属性: 切片
print('lr.intercept_: {}'.format(lr.intercept_))
print('Training set score: {:.2f}'.format(lr.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lr.score(X_test, y_test)))
--------------------------------------------------------------------------
lr.intercept_: -0.031804343026759746
Training set score: 0.67
Test set score: 0.66
--------------------------------------------------------------------------
あまりいい値ではないですが、訓練セットとテストセットに対する値が非常に近いので、これはおそらく適合不足していて、過剰適合はしていません。このような1次元のデータセットでは過剰適合する危険性は少ないですが、高次元のデータセット(特徴量が多い)場合は、過剰適合の可能性は高くなります。 ボストンの住宅価格のデータセット(特徴量が多い)で線形回帰を試してみます。
extended bostonデータセットでモデルを構築・学習・評価する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)
print('Training set score: {:.2f}'.format(lr.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lr.score(X_test, y_test)))
--------------------------------------------------------------------------
Training set score: 0.95
Test set score: 0.61
--------------------------------------------------------------------------
このように訓練セットとテストセットで性能が大きく異なるのは、過剰適合が起きている明らかな兆候です。したがって、より複雑度を制御できるモデルを探さなくてはなりません。標準的な線形回帰に代わる最も一般的な手法がリッジ回帰(Ridge Regression)です。 Summary
Merit
予測手法が比較的理解しやすい
学習、予測が非常に高速
非常に大きいデータセットにも適用できる
Demerit
学習率を調整する必要がある
特徴量の多いデータセットに対して過剰適合しやすい
Parameters
学習率alpha
大きくなると収束は早いが発散しやすくなり、小さいと収束は遅いが発散しにくくなる